<?php
/**
 * 10、设计模式学习-桥接模式
 * 天气改变控制器
 * [关键备注]：本例中假定人工降雨能改变风级
 * 2019年12月11日20:21:46
 */
namespace Application\Controller;

use Application\Common\Bridge\ChangeWeatherNoUseBridge;
use Application\Common\Bridge\Cloud as Cloud;
use Application\Common\Bridge\Wind as Wind;
use Application\Common\Bridge\ArtificialRainfall as ArtificialRainfall;

class WeatherBridgeController extends BaseController
{
    // 没有使用桥接模式，改变天气
    public function noUseBridge()
    {
        $method = '人工降雨-飞机播撒冷却剂';
        $change_weather = new ChangeWeatherNoUseBridge();
        $result_1 = $change_weather -> changeCloud($method);
        $result_2 = $change_weather -> changeWind($method);
        echo "第一种改变天气的方法是：{$result_1}";
        echo '<br />';
        echo "第二种改变天气的方法是：{$result_2}";
        // 总结：没有使用桥接模式，抽象[$method]和实现[$result*]没有分离；扩展能力相对弱一点。不论增加 ChangeWeatherNoUseBridge 的方法、还是被继承为子类，都会使这个类或类层次变得复杂
    }
    // 使用桥接模式，改变天气
    public function useBridge()
    {
        $artificial_rainfall_1 = new ArtificialRainfall(new Cloud);
        $artificial_rainfall_2 = new ArtificialRainfall(new Wind);
        $result_1 = $artificial_rainfall_1 -> changeLevel();
        $result_2 = $artificial_rainfall_2 -> changeLevel();
        echo "第一种改变天气的方法是：{$result_1}";
        echo '<br />';
        echo "第二种改变天气的方法是：{$result_2}";
        // 总结：使用桥接模式，程序的耦合度降低，更易于扩展。
    }
}
